/*
jdk从1.5开始引入了泛型，能够在编译阶段就检查类型安全。
把泛型理解为类型参数，用于指定类型，这个参数是填在类名后面的。
 */
package com.Generics;

public class ScoreT <T>{  //类的定义后面加了一对加括号，括号里面写T，把这个类型转换为泛型类
    String name;
    String id;
    T score;  // T为泛型，根据用户提供的类型自动变成对应类型

    public ScoreT(String name, String id, T score){  //提供的score类型即为T代表的类型
        this.name = name;
        this.id =id;
        this.score = score;
    }

    /*
    泛型本质上也是一个语法糖，并不是JVM所支持的语法，编译后会转换成编译器支持的语法，比如之前的foreach。
    在编译后会被擦除，变回上面的额Object类型调用，只不过类型转换是由编译器帮我们完成，比我们自己转换更安全。
    但idea反编译的看不到编译器帮我们转的效果，要自己反编译，定位到编译的class文件目录下，使用javap反编译
    javap -l ScoreT.class
    打印结果
    LocalVariableTable:
      Start  Length  Slot  Name   Signature
          0      20     0  this   Lcom/Generics/ScoreT;
          0      20     1  name   Ljava/lang/String;
          0      20     2    id   Ljava/lang/String;
          0      20     3 score   Ljava/lang/Object;
      可以看到最后把score还是编译转成了Object类型

      所以说JVM本质不支持泛型，通过这么一种独特的方式支持了泛型，没有放到java语法功能里。
      像这样在编译后泛型的内容消失转变成Object的情况称为 类型擦除。
     */
}
